package agencia.test;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import agencia.Excursion;
import agencia.ExcursionDiaCompleto;
import agencia.ExcursionMedioDia;
import agencia.ExcursionMiniTour;
import agencia.Servicio;
import agencia.exceptions.DuplicadoException;
import agencia.exceptions.PrecioInferiorException;
import agencia.exceptions.ServicioDuplicadoException;

public class AdministrarExcursiones {

	private Excursion excursionA = null;
	@SuppressWarnings("unused")
	private Excursion excursionB = null;
	@SuppressWarnings("unused")
	private Excursion excursionC = null;
	
	@Before
	public void setUp() throws Exception {
		Date fecha = new Date(2008/12/10);
		excursionA = new ExcursionMedioDia("Safari",fecha,5);
		excursionB = new ExcursionDiaCompleto(excursionA);
		excursionC = new ExcursionMiniTour(excursionA);
	}
	
	/**
	 * Agrego a la Excursion 2 servicios iguales esperando una excepcion
	 * por servicios duplicados
	 * @throws PrecioInferiorException 
	 * @throws DuplicadoException 	 * 
	 */
	@Test (expected=ServicioDuplicadoException.class)
	public void testExcursionAgregarServicioDuplicado() throws PrecioInferiorException, DuplicadoException{
		Servicio servicio1 = new Servicio("Ropa blanca", 10);
		Servicio servicio2 = new Servicio("Ropa blanca", 20);
		
		excursionA.agregarServicio(servicio1);
		excursionA.agregarServicio(servicio2);
		
		fail("El Servicio a agregar ya existe; el test ha fallado :(");			
	}
	
	/**
	 * Agrega 2 servicios diferentes a la Excursion exitosamente y chequeo
	 * que los servicios agregados esten dentro de la lista de servicios
	 * de la excursion
	 * @throws PrecioInferiorException 
	 * @throws DuplicadoException 
	 */
	@Test
	public void testExcursionAgregarServicioNoDuplicado() throws PrecioInferiorException, DuplicadoException{
		
		int				cantServicios = 0;
		Servicio 		servicio1 = new Servicio("Ropa blanca", 10);
		Servicio 		servicio2 = new Servicio("Spa", 100);
		List<Servicio> 	listaServicios = new LinkedList<Servicio>();
		
		excursionA.agregarServicio(servicio1);
		excursionA.agregarServicio(servicio2);	
		
		listaServicios = excursionA.getServicios();
		
		for (Iterator<Servicio> it = listaServicios.iterator(); it.hasNext(); ){
			Servicio servicio = (Servicio)it.next();
			assertTrue(servicio.equals(servicio1) || servicio.equals(servicio2));
			cantServicios++;
		}
		assertEquals(2,cantServicios);
	}
	
	/**
	 * Agrego servicios a la Excursion, asigno un precio basico y chequeo
	 * que el precio total haya sido calculado correctamente, donde el
	 * precio de la excursion = a la suma de los precios de todos los
	 * servicios asignados a la excursion mas el precio basico de la 
	 * misma
	 * @throws PrecioInferiorException 
	 * @throws DuplicadoException 
	 */
	@Test 
	public void testExcursionAsignarPrecio() throws PrecioInferiorException, DuplicadoException{
		Servicio 		servicio1 = new Servicio("Ropa blanca", 10);
		Servicio 		servicio2 = new Servicio("Spa", 100);
		float			precio = 123;
		float			sumaPrecioServicios = 0;
		
		excursionA.agregarServicio(servicio1);
		excursionA.agregarServicio(servicio2);	
		
		excursionA.setPrecioBasicoExcursion(precio);
		
		for (Iterator<Servicio> itS = excursionA.getServicios().iterator(); itS.hasNext();){				
			Servicio srv = (Servicio)itS.next();				
			sumaPrecioServicios += srv.getPrecio();
		}		
		
		assertEquals(sumaPrecioServicios + precio, excursionA.getPrecioExcursion());
	}
}
